home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / lpr10.zip / LPQ.C < prev    next >
C/C++ Source or Header  |  1992-11-08  |  3KB  |  155 lines

  1. /*
  2.  * lpr.c - Windows NT lpr
  3.  *
  4.  * by Eric W. Brown
  5.  *    27 October '92
  6.  */
  7. #include <windows.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <winsock.h>
  12. #include "lp.h"
  13.  
  14. #define ARGS_LEN 512
  15. #define DEFAULT_INTERVAL 5
  16.  
  17. int usage()
  18. {
  19.     fprintf(stderr, "Usage: lpq [-Pprinter] [-Sserver] [-l] [+[n]]\n");
  20.     exit(1);
  21.     return 0;
  22. } /* usage() */
  23.  
  24. void main(int argc, char **argv)
  25. {
  26.     int     sockfd = 0;
  27.     char    *printer = NULL;
  28.     char    *server = NULL;
  29.     char    args[ARGS_LEN + 1] = "";
  30.     int        args_len = 0;
  31.     char    request[ARGS_LEN + 128];
  32.     char    request_code = LPD_DISPLAY_SHORT_QUEUE;
  33.     int        interval = 0;
  34.     char    buf[133];
  35.     int        len;
  36.     
  37.     /*
  38.      * Get environment variables
  39.      */
  40.     server = getenv("SERVER");
  41.     printer = getenv("PRINTER");
  42.     if (!printer) 
  43.         printer = DEFAULT_PRINTER;
  44.     
  45.     /*
  46.      * Parse command line
  47.      */
  48. #define NEXT_ARG()  (argc--, argv++, argc ? *argv : (char *)(usage(), NULL))
  49. #define ARG_ARG()   (strlen(*argv) == 2 ? NEXT_ARG() : (*argv) + 2)
  50.     while (argc > 1) {
  51.         NEXT_ARG();
  52.         if (*argv[0] == '-' || *argv[0] == '/') {
  53.             switch(argv[0][1]) {
  54.             case 'P':
  55.                 printer = ARG_ARG();
  56.                 break;
  57.             case 'S':
  58.                 server = ARG_ARG();
  59.                 break;
  60.             case 'l':
  61.                 request_code = LPD_DISPLAY_LONG_QUEUE;
  62.                 break;
  63.             default:
  64.                 fprintf(stderr, "lpq: %s: Invalid option\n", *argv);
  65.                 usage();
  66.             } /* switch */
  67.         }
  68.         else if (*argv[0] == '+') {
  69.             if (argv[0][1] != 0)
  70.                 sscanf(argv[0] + 1, "%d", &interval);
  71.             if (interval <= 0)
  72.                 interval = DEFAULT_INTERVAL;
  73.             fprintf(stderr, "lpq: The '+' option is not supported at this time.\n");
  74.         }
  75.         else {
  76.             args_len += strlen(*argv) + 1;
  77.             if (args_len > ARGS_LEN) {
  78.                 fprintf(stderr, "lpq: Command line too long!\n");
  79.                 exit(1);
  80.             } /* if */
  81.             strcat(args, " ");
  82.             strcat(args, *argv);
  83.         } /* else */
  84.     } /* while argc */
  85.         
  86.     
  87.     /*
  88.      * Do a lookup in the printcap file if necessary
  89.      */
  90.     if (!server)
  91.         if (!(server = lp_printcap_server_lookup(printer))) {
  92.             fprintf(stderr, "No server, %s, and no printer, %s, in printcap file!\n", 
  93.                     server, printer);
  94.             usage();
  95.         } /* if */
  96.     
  97.     
  98.     /*
  99.      * Initialize tcp
  100.      */
  101.     if (lp_tcp_startup()) {
  102.         fprintf(stderr, "lpq: Couldn't initalize tcp/ip\n");
  103.         exit(1);
  104.     } /* if */
  105.     
  106.     
  107.     /*
  108.      * Open socket
  109.      */
  110.     if ((sockfd = lp_tcp_open(server)) < 0) {
  111.         lp_tcp_shutdown();
  112.         fprintf(stderr, "lpq: Couldn't open connection to %s\n", server);
  113.         exit(1);
  114.     } /* if */
  115.     
  116.     
  117.     /*
  118.      * Build request
  119.      */
  120.     sprintf(request, "%c%s%s\n", request_code, printer, args);
  121.  
  122.  
  123.     /*
  124.      * Send request
  125.      */
  126.     if (send(sockfd, request, strlen(request), 0) != (int)strlen(request)) {
  127.         closesocket(sockfd);
  128.         lp_tcp_shutdown();
  129.         fprintf(stderr, "lpq: Error making request\n");
  130.         exit(1);
  131.     } /* if */
  132.     
  133.     
  134.     /*
  135.      * Print output
  136.      */
  137.     while(1) {
  138.         memset((void *)buf, 0, 133);
  139.         len = recv(sockfd, buf, 132, 0);
  140.         if (len <= 0)
  141.             break;
  142.         printf("%s", buf);
  143.     } /* while */
  144.     
  145.     
  146.     /*
  147.      * Clean up
  148.      */
  149.     closesocket(sockfd);
  150.     lp_tcp_shutdown();
  151.     exit(0);
  152. } /* main() */
  153.  
  154.  
  155.